package com.smart.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
// 实现 InvocationHandler
public class PerformaceHandler implements InvocationHandler {
    // target 为目标业务类（希望被代理的对象）
    private Object target;

    public PerformaceHandler(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy 最终生成的代理实例，一般不会用到
     * @param method 被代理目标实例的某个具体方法
     * @param args 被代理实例某个方法的入参
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        PerformanceMonitor.begin(target.getClass().getName() + "." + method.getName());
        // 通过反射方法调用业务类的目标方法
        // 将目标实例传递给 method.invoke() 方法，并调用目标实例的方法
        Object obj = method.invoke(target, args);
        PerformanceMonitor.end();
        return obj;
    }
}
